package com.atguigu.tingshu.search.service;

import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import com.atguigu.tingshu.model.search.AlbumInfoIndex;
import com.atguigu.tingshu.query.search.AlbumIndexQuery;
import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo;

import java.util.List;
import java.util.Map;

public interface SearchService {


    /**
     * 仅用于测试-将指定已存在专辑上架保存到索引库
     *
     * @param albumId 专辑ID
     */
    void upperAlbum(Long albumId);

    /**
     * 该接口仅用于测试-下架指定的专辑，删除索引库中对应文档
     *
     * @param albumId 专辑ID
     */
    void lowerAlbum(Long albumId);

    /**
     * 新增提词记录到提词索引库
     *
     * @param albumInfoIndex 提词文档索引库对象
     */
    void saveSuggestIndex(AlbumInfoIndex albumInfoIndex);

    /**
     * 站内检索，支持关键字、分类、标签条件分页检索，结果高亮
     *
     * @param albumIndexQuery 查询条件对象：包含关键字、分类id、标签列表、排序、分页信息
     * @return 检索内容
     */
    AlbumSearchResponseVo search(AlbumIndexQuery albumIndexQuery);

    /**
     * 构建 SearchRequest 检索请求对象，封装DSL查询条件
     *
     * @param albumIndexQuery 检索条件对象
     * @return 检索请求对象
     */
    SearchRequest buildSearchRequest(AlbumIndexQuery albumIndexQuery);

    /**
     * 解析 SearchResponse 响应结果，封装成 AlbumSearchResponseVo 对象
     *
     * @param searchResponse  响应结果对象
     * @param albumIndexQuery 检索条件对象
     * @return AlbumSearchResponseVo
     */
    AlbumSearchResponseVo parseSearchResponse(SearchResponse<AlbumInfoIndex> searchResponse, AlbumIndexQuery albumIndexQuery);

    /**
     * 查询指定一级分类下置顶3级分类下热门排行专辑
     *
     * @param category1Id 一级分类Id
     * @return List<Map < String, Object>> 包含三级分类对象 baseCategory3，当前三级分类下热门前6的专辑列表 list
     */
    List<Map<String, Object>> getTopCategory3HotAlbums(Long category1Id);

    /**
     * 用户输入关键字自动补全
     *
     * @param keyword 用户输入关键字
     * @return List<String>
     */
    List<String> completeSuggest(String keyword);

    /**
     * 更新所有分类下排行榜-手动调用
     */
    void updateLatelyAlbumRanking();

    /**
     * 获取指定一级分类下指定排序方式的排行榜
     *
     * @param category1Id 一级分类Id
     * @param dimension 排序方式
     * @return List<AlbumInfoIndex> 专辑信息列表
     */
    List<AlbumInfoIndex> getRankingList(Long category1Id, String dimension);
}
